package com.example.music.controller;

import com.example.music.model.Music;
import com.example.music.model.User;
import com.example.music.service.MusicService;
import com.example.music.tools.Constant;
import com.example.music.tools.ResponseBodyMessage;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@RestController
/*@RequestMapping(value = "/music")*/
public class MusicController {

    //存储路径
//    @Value("${music.login.path}")
//    private String SAVE_PATH;
    private String SAVE_PATH = "D:/529/";

    @Autowired
    MusicService musicService;

    @RequestMapping(value = "/upload")
    @Transactional//默认的事务传播级别
    public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer,
                                                    @RequestPart("filename") MultipartFile file,
                                                    HttpServletRequest request) {


        //首先获取到上传文件的名称
        String fileNameAndType = file.getOriginalFilename();//文件名.文件类型
        //歌名
        String title = fileNameAndType.substring(0, fileNameAndType.lastIndexOf("."));
        //查询上传歌曲，是否已经存储过了
        Music music = musicService.select(title, singer);
        if (music != null) {
            return new ResponseBodyMessage<>(-1, "此歌曲已上传，请重新选择！", false);
        }


        //存储路径
        String path = SAVE_PATH + fileNameAndType;
        //"封装”
        File dest = new File(path);
        //如果存储路径不存在，则进行创建
        if (!dest.exists()) {
            dest.mkdir();
        }

        //指定 上传音频文件，上传之后存储的位置
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            //当异常被捕获时，要么 直接抛出异常 throw e；要么使用 保存点 方法来触发事务的回滚
            //否则是不会触发事务回滚的！！！
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return new ResponseBodyMessage<Boolean>(0, "服务器上传失败", false);
        }
        //进行上传数据库
        //1. 准备要 上传的数据

        //用户id
        User user = (User) request.getSession().getAttribute(Constant.USERINFO_SESSION_KEY);
        Integer userid = user.getId();
        String url = "/music/qet?path=" + title;

        //time
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        //通过Date 类 来获取当前系统时间，在按照SimpleDateFormat规定日期形式进行转化
        String time = sf.format(new Date());

        //2.调用 MusicService 中的 insert 方法
        Integer ret = musicService.insert(title, singer, time, url, userid);
        if (ret == 1) {
            //插入成功（上传成功）
            return new ResponseBodyMessage<>(0, "数据库上传成功！", true);
        }
        return new ResponseBodyMessage<>(0, "数据库上传失败！", false);

    }

    @RequestMapping("/get")
    public ResponseEntity<byte[]> func() {
        byte[] a = {97, 98, 99, 100};
        return ResponseEntity.internalServerError().build();
    }

    @RequestMapping("/get1")
    public ResponseEntity<byte[]> get(String Path) {
        //将获取文件的路径准备好
        File file = new File(SAVE_PATH + Path);
        //通过readAllBytes将file路径的文件 读成字节形式
        byte[] a = null;
        try {
            a = Files.readAllBytes(file.toPath());
            if (a != null) {
                //读取成功，将其返回给前段
                return ResponseEntity.ok(a);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //读取失败
        return ResponseEntity.badRequest().build();
    }

    @RequestMapping("/delete")
    public ResponseBodyMessage<Boolean> delete(@RequestParam Integer id) {
        if (id == null) {
            return new ResponseBodyMessage<>(-1, "无效id", false);
        }
        //检查 删除歌曲是否已经在数据库存在
        Music music = musicService.selectMusicById(id);
        if (music == null) {
            return new ResponseBodyMessage<>(-1, "你要删除的歌曲不存在，请重新选择!", false);
        }
        //根据 id 删除指定的歌曲信息[数据库]
        Integer ret = musicService.deleteMusicById(id);
        if (0 == ret) {
            return new ResponseBodyMessage<>(-1, "删除失败", false);
        }
        //这里还需删除，服务器生存储的歌曲数据
        //获取文件名，例如：/music/get?path=Bedroom Eyes
        int index = music.getUrl().lastIndexOf("=");
        String fileName = music.getUrl().substring(index + 1);//截取 歌名
        File file = new File(SAVE_PATH + fileName + ".mp3");
        if (file.delete()) {
            return new ResponseBodyMessage<>(0, "删除成功!", true);
        }
        return new ResponseBodyMessage<>(-1, "删除失败!", false);
    }

    @RequestMapping("/delete1")
    @Transactional
    public ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("ids[]") List<Integer> ids) {
        int sum = 0;
        for (int i = 0; i < ids.size(); i++) {
            //查询歌曲是否存在
            Music music = musicService.selectMusicById(ids.get(i));
            if (music == null) {
                //歌曲不存在，默认删除成功
                sum += 1;
                continue;
            }
            int ret = musicService.deleteMusicById(ids.get(i));
            if (1 == ret) {
                //获取文件名
                int index = music.getUrl().lastIndexOf("=");
                String fileName = music.getUrl().substring(index + 1);//截取 歌名
                File file = new File(SAVE_PATH + fileName + ".mp3");
                if (file.delete()) {
                    sum++;
                    continue;
                }
                //走到这一步，说明服务器删除文件失败，那么相应的事务操作，需要进行回滚
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                //返回 删除失败的信息，以及当前成功删除了多少首歌
                return new ResponseBodyMessage<>(-1, "批量删除失败！当前成功删除了！" + sum + "首歌", false);
            }
            //返回 删除失败的信息，以及当前成功删除了多少首歌
            return new ResponseBodyMessage<>(-1, "批量删除失败！当前成功删除！" + sum + "首歌", false);
        }
        //走到这一步说明 前段要求删除的 歌曲，全部删除完成
        return new ResponseBodyMessage<>(0, "批量删除成功！一共删除了" + sum + "首歌", true);
    }

    @RequestMapping("/findmusic")
    public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required = false) String name) {
        List<Music> list = null;
        if (name == null) {
            list = musicService.findByMusicByName();
        } else {
            list = musicService.findByMusicByName(name);
        }
        return new ResponseBodyMessage<>(0, "查询到了歌曲信息！", list);
    }
}
